#Set working directory to appropriate folder for inputs and outputs on Google Drive

#Initialize

Load data

rm(list = ls())
library(dplyr)

Attaching package: ‘dplyr’

The following objects are masked from ‘package:stats’:

    filter, lag

The following objects are masked from ‘package:base’:

    intersect, setdiff, setequal, union
library(Seurat)
Registered S3 method overwritten by 'data.table':
  method           from
  print.data.table     
Registered S3 method overwritten by 'htmlwidgets':
  method           from         
  print.htmlwidget tools:rstudio
Attaching SeuratObject
Attaching sp
library(ggplot2)
library(RColorBrewer)

`%nin%` = Negate(`%in%`)

#Plot cell cycle

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/all_data_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Preprocess_GEX/second_timepoint_merged.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Filtering_cDNA/resistant_lineage_lists.RData')

load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/cis_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/cocl2_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/dabtram_final_lineages.RData')
load('2022_01_14_analysis_scripts/2022_05_27_analysis/Assign_dominant_barcodes/dabtram_both_times_final_lineages.RData')

Markers within each first drug object to find subgroups (ie analogous to NGFR/EGFR)

need to make Idents metadata object which says if the cells are included in the combined lins list, or if they were filtered

#find lineages that are maintained at both dabtram timepoints
fivecell_cDNA$DabTramMaintained <- Reduce(intersect, list(fivecell_cDNA$DabTram, fivecell_cDNA$DabTramtoDabTram))

filtered_meta <- rep(0, length(names(all_data$Lineage)))

#specify which cells are in lineages that pass filtering for that condition
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% combined_lins_list$DabTram)] <- 'Resistant to DabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% combined_lins_list$DabTramtoDabTram)] <- 'Resistant to DabTramtoDabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %in% combined_lins_list$DabTramtoCoCl2)] <- 'Resistant to DabTramtoCoCl2'
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %in% combined_lins_list$DabTramtoCis)] <- 'Resistant to DabTramtoCis'
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %in% combined_lins_list$CoCl2)] <- 'Resistant to CoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %in% combined_lins_list$CoCl2toDabTram)] <- 'Resistant to CoCl2toDabTram'
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %in% combined_lins_list$CoCl2toCoCl2)] <- 'Resistant to CoCl2toCoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %in% combined_lins_list$CoCl2toCis)] <- 'Resistant to CoCl2toCis'
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %in% combined_lins_list$Cis)] <- 'Resistant to Cis'
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %in% combined_lins_list$CistoDabTram)] <- 'Resistant to CistoDabTram'
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %in% combined_lins_list$CistoCoCl2)] <- 'Resistant to CistoCoCl2'
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %in% combined_lins_list$CistoCis)] <- 'Resistant to CistoCis'

#specify which cells are in lineages of more than 5 cells
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% fivecell_cDNA$DabTram)] <- 'Large Resistant to DabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramtoDabTram)] <- 'Large Resistant to DabTramtoDabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %in% fivecell_cDNA$DabTramtoCoCl2)] <- 'Large Resistant to DabTramtoCoCl2'
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %in% fivecell_cDNA$DabTramtoCis)] <- 'Large Resistant to DabTramtoCis'
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %in% fivecell_cDNA$CoCl2)] <- 'Large Resistant to CoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %in% fivecell_cDNA$CoCl2toDabTram)] <- 'Large Resistant to CoCl2toDabTram'
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %in% fivecell_cDNA$CoCl2toCoCl2)] <- 'Large Resistant to CoCl2toCoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %in% fivecell_cDNA$CoCl2toCis)] <- 'Large Resistant to CoCl2toCis'
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %in% fivecell_cDNA$Cis)] <- 'Large Resistant to Cis'
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %in% fivecell_cDNA$CistoDabTram)] <- 'Large Resistant to CistoDabTram'
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %in% fivecell_cDNA$CistoCoCl2)] <- 'Large Resistant to CistoCoCl2'
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %in% fivecell_cDNA$CistoCis)] <- 'Large Resistant to CistoCis'

# filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramMaintained)] <- 'Maintained Resistant to DabTram'
# filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramMaintained)] <- 'Maintained Resistant to DabTramtoDabTram'

#specify which cells are in lineages that did not pass filtering
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %nin% combined_lins_list$DabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %nin% combined_lins_list$DabTramtoDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %nin% combined_lins_list$DabTramtoCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %nin% combined_lins_list$DabTramtoCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %nin% combined_lins_list$CoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %nin% combined_lins_list$CoCl2toDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %nin% combined_lins_list$CoCl2toCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %nin% combined_lins_list$CoCl2toCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %nin% combined_lins_list$Cis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %nin% combined_lins_list$CistoDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %nin% combined_lins_list$CistoCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %nin% combined_lins_list$CistoCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 

#specify which cells had zero or multiple barcodes
filtered_meta[which(all_data$Lineage %in% c("No Barcode", "Still multiple"))] <- 'No Barcode'

print(table(filtered_meta))
#find lineages that are maintained at both dabtram timepoints
fivecell_cDNA$DabTramMaintained <- Reduce(intersect, list(fivecell_cDNA$DabTram, fivecell_cDNA$DabTramtoDabTram))

filtered_meta <- rep(0, length(names(all_data$Lineage)))

#specify which cells are in lineages that pass filtering for that condition
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% combined_lins_list$DabTram)] <- 'Resistant to DabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% combined_lins_list$DabTramtoDabTram)] <- 'Resistant to DabTramtoDabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %in% combined_lins_list$DabTramtoCoCl2)] <- 'Resistant to DabTramtoCoCl2'
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %in% combined_lins_list$DabTramtoCis)] <- 'Resistant to DabTramtoCis'
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %in% combined_lins_list$CoCl2)] <- 'Resistant to CoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %in% combined_lins_list$CoCl2toDabTram)] <- 'Resistant to CoCl2toDabTram'
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %in% combined_lins_list$CoCl2toCoCl2)] <- 'Resistant to CoCl2toCoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %in% combined_lins_list$CoCl2toCis)] <- 'Resistant to CoCl2toCis'
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %in% combined_lins_list$Cis)] <- 'Resistant to Cis'
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %in% combined_lins_list$CistoDabTram)] <- 'Resistant to CistoDabTram'
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %in% combined_lins_list$CistoCoCl2)] <- 'Resistant to CistoCoCl2'
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %in% combined_lins_list$CistoCis)] <- 'Resistant to CistoCis'

#specify which cells are in lineages of more than 5 cells
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% fivecell_cDNA$DabTram)] <- 'Large Resistant to DabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramtoDabTram)] <- 'Large Resistant to DabTramtoDabTram'
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %in% fivecell_cDNA$DabTramtoCoCl2)] <- 'Large Resistant to DabTramtoCoCl2'
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %in% fivecell_cDNA$DabTramtoCis)] <- 'Large Resistant to DabTramtoCis'
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %in% fivecell_cDNA$CoCl2)] <- 'Large Resistant to CoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %in% fivecell_cDNA$CoCl2toDabTram)] <- 'Large Resistant to CoCl2toDabTram'
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %in% fivecell_cDNA$CoCl2toCoCl2)] <- 'Large Resistant to CoCl2toCoCl2'
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %in% fivecell_cDNA$CoCl2toCis)] <- 'Large Resistant to CoCl2toCis'
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %in% fivecell_cDNA$Cis)] <- 'Large Resistant to Cis'
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %in% fivecell_cDNA$CistoDabTram)] <- 'Large Resistant to CistoDabTram'
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %in% fivecell_cDNA$CistoCoCl2)] <- 'Large Resistant to CistoCoCl2'
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %in% fivecell_cDNA$CistoCis)] <- 'Large Resistant to CistoCis'

# filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramMaintained)] <- 'Maintained Resistant to DabTram'
# filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %in% fivecell_cDNA$DabTramMaintained)] <- 'Maintained Resistant to DabTramtoDabTram'

#specify which cells are in lineages that did not pass filtering
filtered_meta[which(all_data$OG_condition == "dabtram" & all_data$Lineage %nin% combined_lins_list$DabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtodabtram" & all_data$Lineage %nin% combined_lins_list$DabTramtoDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtococl2" & all_data$Lineage %nin% combined_lins_list$DabTramtoCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "dabtramtocis" & all_data$Lineage %nin% combined_lins_list$DabTramtoCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2" & all_data$Lineage %nin% combined_lins_list$CoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2todabtram" & all_data$Lineage %nin% combined_lins_list$CoCl2toDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2tococl2" & all_data$Lineage %nin% combined_lins_list$CoCl2toCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cocl2tocis" & all_data$Lineage %nin% combined_lins_list$CoCl2toCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cis" & all_data$Lineage %nin% combined_lins_list$Cis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistodabtram" & all_data$Lineage %nin% combined_lins_list$CistoDabTram & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistococl2" & all_data$Lineage %nin% combined_lins_list$CistoCoCl2 & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 
filtered_meta[which(all_data$OG_condition == "cistocis" & all_data$Lineage %nin% combined_lins_list$CistoCis & all_data$Lineage %nin% c("No Barcode", "Still multiple"))] <- 'Filtered out' 

#specify which cells had zero or multiple barcodes
filtered_meta[which(all_data$Lineage %in% c("No Barcode", "Still multiple"))] <- 'No Barcode'

print(table(filtered_meta))
filtered_meta
                       Filtered out              Large Resistant to Cis         Large Resistant to CistoCis       Large Resistant to CistoCoCl2     Large Resistant to CistoDabTram 
                               3337                                1375                                 951                                2078                                1394 
           Large Resistant to CoCl2       Large Resistant to CoCl2toCis     Large Resistant to CoCl2toCoCl2   Large Resistant to CoCl2toDabTram          Large Resistant to DabTram 
                               1784                                3010                               11578                                 663                                 478 
    Large Resistant to DabTramtoCis   Large Resistant to DabTramtoCoCl2 Large Resistant to DabTramtoDabTram                          No Barcode                    Resistant to Cis 
                               4234                                2840                                3176                               35314                                 331 
              Resistant to CistoCis             Resistant to CistoCoCl2           Resistant to CistoDabTram                  Resistant to CoCl2             Resistant to CoCl2toCis 
                                 67                                 135                                 113                                 278                                 157 
          Resistant to CoCl2toCoCl2         Resistant to CoCl2toDabTram                Resistant to DabTram           Resistant to DabTramtoCis         Resistant to DabTramtoCoCl2 
                                 55                                  93                                 337                                 225                                 100 
      Resistant to DabTramtoDabTram 
                                222 
all_data$Resistant_filtered <- filtered_meta
Idents(all_data) <- all_data$Resistant_filtered
```r
all_data$Resistant_filtered <- filtered_meta
Idents(all_data) <- all_data$Resistant_filtered

<!-- rnb-source-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#Looking into the one lineage that switches ngfr -> egfr

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuYGBgclxucGRmKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vdGVzdF9wbG90LnBkZicsIGhlaWdodCA9IDEwLCB3aWR0aCA9IDIwKVxuRGltUGxvdChhbGxfZGF0YSwgZ3JvdXAuYnkgPSAnaWRlbnQnLCBjb2xzID0gKVxuRGltUGxvdChhbGxfZGF0YSwgZ3JvdXAuYnkgPSBcXExpbmVhZ2VcXCkgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpXG5gYGBcbmBgYHJcbmRldi5vZmYoKVxuYGBgXG5gYGAifQ== -->

```r
```r
pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/test_plot.pdf', height = 10, width = 20)
DimPlot(all_data, group.by = 'ident', cols = )
DimPlot(all_data, group.by = \Lineage\) + theme(legend.position = 'none')
dev.off()

<!-- rnb-source-end -->

<!-- rnb-output-begin eyJkYXRhIjoibnVsbCBkZXZpY2UgXG4gICAgICAgICAgMSBcbiJ9 -->

null device 1




<!-- rnb-output-end -->

<!-- rnb-chunk-end -->


<!-- rnb-text-begin -->


#from dabtram_both_times, force 2 clusters in umap, plot vs ngfr egfr, find markers of these 2

<!-- rnb-text-end -->


<!-- rnb-chunk-begin -->


<!-- rnb-source-begin eyJkYXRhIjoiYGBgclxuXG5zd2l0Y2hfbGluX2RhYnRyYW0gPC0gbmFtZXMoYWxsX2RhdGEkb3JpZy5pZGVudFthbGxfZGF0YSRMaW5lYWdlID09IFwiTGluMTcxNTE2XCIgJiBhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gJ2RhYnRyYW0nXSlcbnN3aXRjaF9saW5fZGFidHJhbXRvZGFidHJhbSA8LSBuYW1lcyhhbGxfZGF0YSRvcmlnLmlkZW50W2FsbF9kYXRhJExpbmVhZ2UgPT0gXCJMaW4xNzE1MTZcIiAmIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnZGFidHJhbXRvZGFidHJhbSddKVxuXG5EaW1QbG90KGFsbF9kYXRhLCBncm91cC5ieSA9IFwiT0dfY29uZGl0aW9uXCIsIGNvbHMgPSBjKCdkYWJ0cmFtJyA9ICcjNjIzNTk0JywgJ2NvY2wyJyA9ICcjMEY4MjQxJywgJ2NpcycgPSAnI0M5NkQyOScsICdkYWJ0cmFtdG9kYWJ0cmFtJyA9ICcjNTYxRTU5JywgJ2RhYnRyYW10b2NvY2wyJyA9ICcjQTIyNDhFJywgJ2RhYnRyYW10b2NpcycgPSAnIzlEODVCRScsICdjb2NsMnRvZGFidHJhbScgPSAnIzEwNDEzQicsICdjb2NsMnRvY29jbDInID0gJyM2QUJENDUnLCAnY29jbDJ0b2NpcycgPSAnIzZEQzQ5QycsICdjaXN0b2RhYnRyYW0nID0gJyNBMjM2MjInLCAnY2lzdG9jb2NsMicgPSAnI0Y0OTEyOScsICdjaXN0b2NpcycgPSAnI0ZCRDA4QycpKVxuYGBgIn0= -->

```r

switch_lin_dabtram <- names(all_data$orig.ident[all_data$Lineage == "Lin171516" & all_data$OG_condition == 'dabtram'])
switch_lin_dabtramtodabtram <- names(all_data$orig.ident[all_data$Lineage == "Lin171516" & all_data$OG_condition == 'dabtramtodabtram'])

DimPlot(all_data, group.by = "OG_condition", cols = c('dabtram' = '#623594', 'cocl2' = '#0F8241', 'cis' = '#C96D29', 'dabtramtodabtram' = '#561E59', 'dabtramtococl2' = '#A2248E', 'dabtramtocis' = '#9D85BE', 'cocl2todabtram' = '#10413B', 'cocl2tococl2' = '#6ABD45', 'cocl2tocis' = '#6DC49C', 'cistodabtram' = '#A23622', 'cistococl2' = '#F49129', 'cistocis' = '#FBD08C'))

DimPlot(all_data, cells.highlight = list(switch_lin_dabtram), cols.highlight = c('red'))

DimPlot(all_data, cells.highlight = list(switch_lin_dabtram, switch_lin_dabtramtodabtram), cols.highlight = c('blue', 'red'))


switch_lin <- names(dabtram$orig.ident[dabtram$Lineage == "Lin171516"])
DimPlot(dabtram)

DimPlot(dabtram, cells.highlight = list(switch_lin))


#need to integrate lineages into just dabtram object and then plot off of this isntead?
#vlnplot(all_data, features = ngfr, idents = just the cells resistant to dabtram, group.by = lineage but i only want those included in combined_lins_list$dabtram ?

#Assign cluster assignments per lineage, find average score per lineage - make plots in order


dabtram_both_times_markers <- FindAllMarkers(dabtram_both_times, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
Calculating cluster 0

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~19s          
  |++                                                | 2 % ~18s          
  |++                                                | 3 % ~18s          
  |+++                                               | 4 % ~18s          
  |+++                                               | 6 % ~17s          
  |++++                                              | 7 % ~17s          
  |++++                                              | 8 % ~17s          
  |+++++                                             | 9 % ~17s          
  |+++++                                             | 10% ~16s          
  |++++++                                            | 11% ~16s          
  |+++++++                                           | 12% ~16s          
  |+++++++                                           | 13% ~16s          
  |++++++++                                          | 14% ~16s          
  |++++++++                                          | 16% ~15s          
  |+++++++++                                         | 17% ~15s          
  |+++++++++                                         | 18% ~15s          
  |++++++++++                                        | 19% ~15s          
  |++++++++++                                        | 20% ~15s          
  |+++++++++++                                       | 21% ~15s          
  |++++++++++++                                      | 22% ~14s          
  |++++++++++++                                      | 23% ~14s          
  |+++++++++++++                                     | 24% ~14s          
  |+++++++++++++                                     | 26% ~14s          
  |++++++++++++++                                    | 27% ~13s          
  |++++++++++++++                                    | 28% ~13s          
  |+++++++++++++++                                   | 29% ~13s          
  |+++++++++++++++                                   | 30% ~13s          
  |++++++++++++++++                                  | 31% ~13s          
  |+++++++++++++++++                                 | 32% ~12s          
  |+++++++++++++++++                                 | 33% ~12s          
  |++++++++++++++++++                                | 34% ~12s          
  |++++++++++++++++++                                | 36% ~12s          
  |+++++++++++++++++++                               | 37% ~12s          
  |+++++++++++++++++++                               | 38% ~11s          
  |++++++++++++++++++++                              | 39% ~11s          
  |++++++++++++++++++++                              | 40% ~11s          
  |+++++++++++++++++++++                             | 41% ~11s          
  |++++++++++++++++++++++                            | 42% ~11s          
  |++++++++++++++++++++++                            | 43% ~10s          
  |+++++++++++++++++++++++                           | 44% ~10s          
  |+++++++++++++++++++++++                           | 46% ~10s          
  |++++++++++++++++++++++++                          | 47% ~10s          
  |++++++++++++++++++++++++                          | 48% ~10s          
  |+++++++++++++++++++++++++                         | 49% ~09s          
  |+++++++++++++++++++++++++                         | 50% ~09s          
  |++++++++++++++++++++++++++                        | 51% ~09s          
  |+++++++++++++++++++++++++++                       | 52% ~09s          
  |+++++++++++++++++++++++++++                       | 53% ~09s          
  |++++++++++++++++++++++++++++                      | 54% ~08s          
  |++++++++++++++++++++++++++++                      | 56% ~08s          
  |+++++++++++++++++++++++++++++                     | 57% ~08s          
  |+++++++++++++++++++++++++++++                     | 58% ~08s          
  |++++++++++++++++++++++++++++++                    | 59% ~08s          
  |++++++++++++++++++++++++++++++                    | 60% ~07s          
  |+++++++++++++++++++++++++++++++                   | 61% ~07s          
  |++++++++++++++++++++++++++++++++                  | 62% ~07s          
  |++++++++++++++++++++++++++++++++                  | 63% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 64% ~07s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~06s          
  |++++++++++++++++++++++++++++++++++                | 67% ~06s          
  |++++++++++++++++++++++++++++++++++                | 68% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~06s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 72% ~05s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 74% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~04s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~04s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 82% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 92% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=18s  
Calculating cluster 1

  |                                                  | 0 % ~calculating  
  |+                                                 | 1 % ~21s          
  |+                                                 | 2 % ~21s          
  |++                                                | 3 % ~21s          
  |++                                                | 4 % ~21s          
  |+++                                               | 5 % ~20s          
  |+++                                               | 6 % ~20s          
  |++++                                              | 7 % ~20s          
  |++++                                              | 8 % ~20s          
  |+++++                                             | 9 % ~20s          
  |+++++                                             | 10% ~20s          
  |++++++                                            | 11% ~19s          
  |++++++                                            | 12% ~19s          
  |+++++++                                           | 13% ~19s          
  |+++++++                                           | 14% ~19s          
  |++++++++                                          | 15% ~19s          
  |++++++++                                          | 16% ~18s          
  |+++++++++                                         | 17% ~18s          
  |+++++++++                                         | 18% ~18s          
  |++++++++++                                        | 19% ~18s          
  |++++++++++                                        | 20% ~17s          
  |+++++++++++                                       | 21% ~17s          
  |+++++++++++                                       | 22% ~17s          
  |++++++++++++                                      | 23% ~17s          
  |++++++++++++                                      | 24% ~17s          
  |+++++++++++++                                     | 25% ~16s          
  |+++++++++++++                                     | 26% ~16s          
  |++++++++++++++                                    | 27% ~16s          
  |++++++++++++++                                    | 28% ~16s          
  |+++++++++++++++                                   | 29% ~15s          
  |+++++++++++++++                                   | 30% ~15s          
  |++++++++++++++++                                  | 31% ~15s          
  |++++++++++++++++                                  | 32% ~15s          
  |+++++++++++++++++                                 | 33% ~15s          
  |+++++++++++++++++                                 | 34% ~14s          
  |++++++++++++++++++                                | 35% ~15s          
  |++++++++++++++++++                                | 36% ~15s          
  |+++++++++++++++++++                               | 37% ~14s          
  |+++++++++++++++++++                               | 38% ~14s          
  |++++++++++++++++++++                              | 39% ~14s          
  |++++++++++++++++++++                              | 40% ~14s          
  |+++++++++++++++++++++                             | 41% ~13s          
  |+++++++++++++++++++++                             | 42% ~13s          
  |++++++++++++++++++++++                            | 43% ~13s          
  |++++++++++++++++++++++                            | 44% ~13s          
  |+++++++++++++++++++++++                           | 45% ~12s          
  |+++++++++++++++++++++++                           | 46% ~12s          
  |++++++++++++++++++++++++                          | 47% ~12s          
  |++++++++++++++++++++++++                          | 48% ~12s          
  |+++++++++++++++++++++++++                         | 49% ~11s          
  |+++++++++++++++++++++++++                         | 50% ~11s          
  |++++++++++++++++++++++++++                        | 51% ~11s          
  |++++++++++++++++++++++++++                        | 52% ~11s          
  |+++++++++++++++++++++++++++                       | 53% ~10s          
  |+++++++++++++++++++++++++++                       | 54% ~10s          
  |++++++++++++++++++++++++++++                      | 55% ~10s          
  |++++++++++++++++++++++++++++                      | 56% ~10s          
  |+++++++++++++++++++++++++++++                     | 57% ~10s          
  |+++++++++++++++++++++++++++++                     | 58% ~09s          
  |++++++++++++++++++++++++++++++                    | 59% ~09s          
  |++++++++++++++++++++++++++++++                    | 60% ~09s          
  |+++++++++++++++++++++++++++++++                   | 61% ~09s          
  |+++++++++++++++++++++++++++++++                   | 62% ~08s          
  |++++++++++++++++++++++++++++++++                  | 63% ~08s          
  |++++++++++++++++++++++++++++++++                  | 64% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 65% ~08s          
  |+++++++++++++++++++++++++++++++++                 | 66% ~07s          
  |++++++++++++++++++++++++++++++++++                | 67% ~07s          
  |++++++++++++++++++++++++++++++++++                | 68% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 69% ~07s          
  |+++++++++++++++++++++++++++++++++++               | 70% ~07s          
  |++++++++++++++++++++++++++++++++++++              | 71% ~06s          
  |++++++++++++++++++++++++++++++++++++              | 72% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 73% ~06s          
  |+++++++++++++++++++++++++++++++++++++             | 74% ~06s          
  |++++++++++++++++++++++++++++++++++++++            | 75% ~05s          
  |++++++++++++++++++++++++++++++++++++++            | 76% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 77% ~05s          
  |+++++++++++++++++++++++++++++++++++++++           | 78% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 79% ~05s          
  |++++++++++++++++++++++++++++++++++++++++          | 80% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 81% ~04s          
  |+++++++++++++++++++++++++++++++++++++++++         | 82% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 83% ~04s          
  |++++++++++++++++++++++++++++++++++++++++++        | 84% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 85% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++       | 86% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 87% ~03s          
  |++++++++++++++++++++++++++++++++++++++++++++      | 88% ~03s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 89% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++     | 90% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 91% ~02s          
  |++++++++++++++++++++++++++++++++++++++++++++++    | 92% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 93% ~02s          
  |+++++++++++++++++++++++++++++++++++++++++++++++   | 94% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 95% ~01s          
  |++++++++++++++++++++++++++++++++++++++++++++++++  | 96% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 97% ~01s          
  |+++++++++++++++++++++++++++++++++++++++++++++++++ | 98% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 99% ~00s          
  |++++++++++++++++++++++++++++++++++++++++++++++++++| 100% elapsed=22s  
DimPlot(dabtram_both_times)

DimPlot(dabtram_both_times, group.by = 'OG_condition')

FeaturePlot(dabtram_both_times, features = c('NGFR', 'EGFR', 'nFeature_RNA'))

#Plot scores as heatmap


pdf('2022_01_14_analysis_scripts/2022_05_27_analysis/Lineage_expression/stacked_bar_EGFR_NGFR_Died.pdf')
ggarrange(p1,p2, nrow = 2)
dev.off()
null device 
          1 
LS0tCnRpdGxlOiAiTGluZWFnZSBleHByZXNzaW9uIG92ZXIgdGltZSIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQoKI1NldCB3b3JraW5nIGRpcmVjdG9yeSB0byBhcHByb3ByaWF0ZSBmb2xkZXIgZm9yIGlucHV0cyBhbmQgb3V0cHV0cyBvbiBHb29nbGUgRHJpdmUKYGBge3IsIHNldHVwLCBpbmNsdWRlPUZBTFNFfQoja25pdHI6Om9wdHNfa25pdCRzZXQocm9vdC5kaXIgPSAnL1ZvbHVtZXMvR29vZ2xlRHJpdmUvTXkgRHJpdmUvRmFzc2VfU2hhcmVkL0FKRl9Ecml2ZV9jb3B5L0V4cGVyaW1lbnRzL0FKRjAwOScpICMgZm9yIGFyaWEncyBjb21wdXRlcgprbml0cjo6b3B0c19rbml0JHNldChyb290LmRpciA9ICcvVm9sdW1lcy9Hb29nbGVEcml2ZS8uc2hvcnRjdXQtdGFyZ2V0cy1ieS1pZC8xelNxeDNJelhNd3Q2Y2xVand5cW1sT2Y0RzFLNTNsdnkvRmFzc2VfU2hhcmVkL0FKRl9Ecml2ZV9jb3B5L0V4cGVyaW1lbnRzL0FKRjAwOScpICMgZm9yIGR5bGFuJ3MgY29tcHV0ZXIKCiMyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vIGlzIGFkZGl0aW9uYWwgcGF0aCBmb3Igb3V0cHV0cwoKYGBgCgojSW5pdGlhbGl6ZQpgYGB7ciBpbmNsdWRlID0gRkFMU0V9CnJtKGxpc3QgPSBscygpKQpsaWJyYXJ5KGRwbHlyKQpsaWJyYXJ5KFNldXJhdCkKbGlicmFyeShnZ3Bsb3QyKQpsaWJyYXJ5KFJDb2xvckJyZXdlcikKbGlicmFyeShnZ3B1YikKCmAlbmluJWAgPSBOZWdhdGUoYCVpbiVgKQpgYGAKCiMgTG9hZCBkYXRhCmBgYHtyfQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvYWxsX2RhdGFfZmluYWxfbGluZWFnZXMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9QcmVwcm9jZXNzX0dFWC9zZWNvbmRfdGltZXBvaW50X21lcmdlZC5SRGF0YScpCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0ZpbHRlcmluZ19jRE5BL3Jlc2lzdGFudF9saW5lYWdlX2xpc3RzLlJEYXRhJykKCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0Fzc2lnbl9kb21pbmFudF9iYXJjb2Rlcy9jaXNfZmluYWxfbGluZWFnZXMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvY29jbDJfZmluYWxfbGluZWFnZXMuUkRhdGEnKQpsb2FkKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9Bc3NpZ25fZG9taW5hbnRfYmFyY29kZXMvZGFidHJhbV9maW5hbF9saW5lYWdlcy5SRGF0YScpCmxvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0Fzc2lnbl9kb21pbmFudF9iYXJjb2Rlcy9kYWJ0cmFtX2JvdGhfdGltZXNfZmluYWxfbGluZWFnZXMuUkRhdGEnKQoKYGBgCgojUGxvdCBjZWxsIGN5Y2xlCmBgYHtyfQoKIyB2aWV3IGNlbGwgY3ljbGUgc2NvcmVzIGFuZCBwaGFzZSBhc3NpZ25tZW50cwpEaW1QbG90KGFsbF9kYXRhLCBncm91cC5ieSA9ICJQaGFzZSIpCkRpbVBsb3QoYWxsX2RhdGEpCkZlYXR1cmVQbG90KG9iamVjdCA9IGFsbF9kYXRhLCByZWR1Y3Rpb24gPSAndW1hcCcsIGZlYXR1cmVzID0gKCJuRmVhdHVyZV9STkEiKSwgcHQuc2l6ZSA9IDEsIGNvbWJpbmUgPSBULCBvcmRlciA9IFRSVUUpCkRpbVBsb3QoYWxsX2RhdGEsIGdyb3VwLmJ5ID0gIk9HX2NvbmRpdGlvbiIsIGNvbHMgPSBjKCdkYWJ0cmFtJyA9ICcjNjIzNTk0JywgJ2NvY2wyJyA9ICcjMEY4MjQxJywgJ2NpcycgPSAnI0M5NkQyOScsICdkYWJ0cmFtdG9kYWJ0cmFtJyA9ICcjNTYxRTU5JywgJ2RhYnRyYW10b2NvY2wyJyA9ICcjQTIyNDhFJywgJ2RhYnRyYW10b2NpcycgPSAnIzlEODVCRScsICdjb2NsMnRvZGFidHJhbScgPSAnIzEwNDEzQicsICdjb2NsMnRvY29jbDInID0gJyM2QUJENDUnLCAnY29jbDJ0b2NpcycgPSAnIzZEQzQ5QycsICdjaXN0b2RhYnRyYW0nID0gJyNBMjM2MjInLCAnY2lzdG9jb2NsMicgPSAnI0Y0OTEyOScsICdjaXN0b2NpcycgPSAnI0ZCRDA4QycpKQoKYGBgCgojIE1hcmtlcnMgd2l0aGluIGVhY2ggZmlyc3QgZHJ1ZyBvYmplY3QgdG8gZmluZCBzdWJncm91cHMgKGllIGFuYWxvZ291cyB0byBOR0ZSL0VHRlIpCmBgYHtyIGluY2x1ZGUgPSBGQUxTRX0KI2xvYWQoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9hbGxfZGF0YV9tYXJrZXJzLlJEYXRhJykKY2lzX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoY2lzLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQpjb2NsMl9tYXJrZXJzIDwtIEZpbmRBbGxNYXJrZXJzKGNvY2wyLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQpkYWJ0cmFtX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoZGFidHJhbSwgb25seS5wb3MgPSBUUlVFLCBtaW4ucGN0ID0gMC4yNSwgbG9nZmMudGhyZXNob2xkID0gMC4yNSkKCmFsbF9kYXRhLm1hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoYWxsX2RhdGEsIG9ubHkucG9zID0gVFJVRSwgbWluLnBjdCA9IDAuMjUsIGxvZ2ZjLnRocmVzaG9sZCA9IDAuMjUpIApzYXZlKGFsbF9kYXRhLm1hcmtlcnMsIGNpc19tYXJrZXJzLCBjb2NsMl9tYXJrZXJzLCBkYWJ0cmFtX21hcmtlcnMsIGZpbGUgPSAnYWxsX2RhdGFfbWFya2Vycy5SRGF0YScpCmBgYAoKIyBuZWVkIHRvIG1ha2UgSWRlbnRzIG1ldGFkYXRhIG9iamVjdCB3aGljaCBzYXlzIGlmIHRoZSBjZWxscyBhcmUgaW5jbHVkZWQgaW4gdGhlIGNvbWJpbmVkIGxpbnMgbGlzdCwgb3IgaWYgdGhleSB3ZXJlIGZpbHRlcmVkCmBgYHtyfQojZmluZCBsaW5lYWdlcyB0aGF0IGFyZSBtYWludGFpbmVkIGF0IGJvdGggZGFidHJhbSB0aW1lcG9pbnRzCmZpdmVjZWxsX2NETkEkRGFiVHJhbU1haW50YWluZWQgPC0gUmVkdWNlKGludGVyc2VjdCwgbGlzdChmaXZlY2VsbF9jRE5BJERhYlRyYW0sIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvRGFiVHJhbSkpCgpmaWx0ZXJlZF9tZXRhIDwtIHJlcCgwLCBsZW5ndGgobmFtZXMoYWxsX2RhdGEkTGluZWFnZSkpKQoKI3NwZWNpZnkgd2hpY2ggY2VsbHMgYXJlIGluIGxpbmVhZ2VzIHRoYXQgcGFzcyBmaWx0ZXJpbmcgZm9yIHRoYXQgY29uZGl0aW9uCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbSldIDwtICdSZXNpc3RhbnQgdG8gRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtdG9EYWJUcmFtKV0gPC0gJ1Jlc2lzdGFudCB0byBEYWJUcmFtdG9EYWJUcmFtJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbXRvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtdG9Db0NsMildIDwtICdSZXNpc3RhbnQgdG8gRGFiVHJhbXRvQ29DbDInCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtdG9DaXMpXSA8LSAnUmVzaXN0YW50IHRvIERhYlRyYW10b0NpcycKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ29DbDIpXSA8LSAnUmVzaXN0YW50IHRvIENvQ2wyJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY29jbDJ0b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvRGFiVHJhbSldIDwtICdSZXNpc3RhbnQgdG8gQ29DbDJ0b0RhYlRyYW0nCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjb2NsMnRvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvQ29DbDIpXSA8LSAnUmVzaXN0YW50IHRvIENvQ2wydG9Db0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvQ2lzKV0gPC0gJ1Jlc2lzdGFudCB0byBDb0NsMnRvQ2lzJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBjb21iaW5lZF9saW5zX2xpc3QkQ2lzKV0gPC0gJ1Jlc2lzdGFudCB0byBDaXMnCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXN0b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXN0b0RhYlRyYW0pXSA8LSAnUmVzaXN0YW50IHRvIENpc3RvRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXN0b0NvQ2wyKV0gPC0gJ1Jlc2lzdGFudCB0byBDaXN0b0NvQ2wyJwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzdG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXN0b0NpcyldIDwtICdSZXNpc3RhbnQgdG8gQ2lzdG9DaXMnCgojc3BlY2lmeSB3aGljaCBjZWxscyBhcmUgaW4gbGluZWFnZXMgb2YgbW9yZSB0aGFuIDUgY2VsbHMKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkRGFiVHJhbSldIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkRGFiVHJhbXRvRGFiVHJhbSldIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gRGFiVHJhbXRvRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2NvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJERhYlRyYW10b0NvQ2wyKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBEYWJUcmFtdG9Db0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2NpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSREYWJUcmFtdG9DaXMpXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIERhYlRyYW10b0NpcycKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJENvQ2wyKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBDb0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJENvQ2wydG9EYWJUcmFtKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBDb0NsMnRvRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9jb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSRDb0NsMnRvQ29DbDIpXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIENvQ2wydG9Db0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkQ29DbDJ0b0NpcyldIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gQ29DbDJ0b0NpcycKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSRDaXMpXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIENpcycKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSRDaXN0b0RhYlRyYW0pXSA8LSAnTGFyZ2UgUmVzaXN0YW50IHRvIENpc3RvRGFiVHJhbScKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvY29jbDIiICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkQ2lzdG9Db0NsMildIDwtICdMYXJnZSBSZXNpc3RhbnQgdG8gQ2lzdG9Db0NsMicKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpc3RvY2lzIiAmIGFsbF9kYXRhJExpbmVhZ2UgJWluJSBmaXZlY2VsbF9jRE5BJENpc3RvQ2lzKV0gPC0gJ0xhcmdlIFJlc2lzdGFudCB0byBDaXN0b0NpcycKCiMgZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlaW4lIGZpdmVjZWxsX2NETkEkRGFiVHJhbU1haW50YWluZWQpXSA8LSAnTWFpbnRhaW5lZCBSZXNpc3RhbnQgdG8gRGFiVHJhbScKIyBmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbXRvZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVpbiUgZml2ZWNlbGxfY0ROQSREYWJUcmFtTWFpbnRhaW5lZCldIDwtICdNYWludGFpbmVkIFJlc2lzdGFudCB0byBEYWJUcmFtdG9EYWJUcmFtJwoKI3NwZWNpZnkgd2hpY2ggY2VsbHMgYXJlIGluIGxpbmVhZ2VzIHRoYXQgZGlkIG5vdCBwYXNzIGZpbHRlcmluZwpmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiZGFidHJhbSIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImRhYnRyYW10b2RhYnRyYW0iICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbXRvRGFiVHJhbSAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9jb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCREYWJUcmFtdG9Db0NsMiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJkYWJ0cmFtdG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkRGFiVHJhbXRvQ2lzICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JENvQ2wyICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JENvQ2wydG9EYWJUcmFtICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNvY2wydG9jb2NsMiIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvQ29DbDIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIApmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY29jbDJ0b2NpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDb0NsMnRvQ2lzICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjKCJObyBCYXJjb2RlIiwgIlN0aWxsIG11bHRpcGxlIikpXSA8LSAnRmlsdGVyZWQgb3V0JyAKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRPR19jb25kaXRpb24gPT0gImNpcyIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGNvbWJpbmVkX2xpbnNfbGlzdCRDaXMgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIApmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzdG9kYWJ0cmFtIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JENpc3RvRGFiVHJhbSAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ0ZpbHRlcmVkIG91dCcgCmZpbHRlcmVkX21ldGFbd2hpY2goYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICJjaXN0b2NvY2wyIiAmIGFsbF9kYXRhJExpbmVhZ2UgJW5pbiUgY29tYmluZWRfbGluc19saXN0JENpc3RvQ29DbDIgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIApmaWx0ZXJlZF9tZXRhW3doaWNoKGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAiY2lzdG9jaXMiICYgYWxsX2RhdGEkTGluZWFnZSAlbmluJSBjb21iaW5lZF9saW5zX2xpc3QkQ2lzdG9DaXMgJiBhbGxfZGF0YSRMaW5lYWdlICVuaW4lIGMoIk5vIEJhcmNvZGUiLCAiU3RpbGwgbXVsdGlwbGUiKSldIDwtICdGaWx0ZXJlZCBvdXQnIAoKI3NwZWNpZnkgd2hpY2ggY2VsbHMgaGFkIHplcm8gb3IgbXVsdGlwbGUgYmFyY29kZXMKZmlsdGVyZWRfbWV0YVt3aGljaChhbGxfZGF0YSRMaW5lYWdlICVpbiUgYygiTm8gQmFyY29kZSIsICJTdGlsbCBtdWx0aXBsZSIpKV0gPC0gJ05vIEJhcmNvZGUnCgpwcmludCh0YWJsZShmaWx0ZXJlZF9tZXRhKSkKCmBgYAoKYGBge3J9CmFsbF9kYXRhJFJlc2lzdGFudF9maWx0ZXJlZCA8LSBmaWx0ZXJlZF9tZXRhCklkZW50cyhhbGxfZGF0YSkgPC0gYWxsX2RhdGEkUmVzaXN0YW50X2ZpbHRlcmVkCmBgYAoKYGBge3J9CnBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL3Rlc3RfcGxvdC5wZGYnLCBoZWlnaHQgPSAxMCwgd2lkdGggPSAyMCkKRGltUGxvdChhbGxfZGF0YSwgZ3JvdXAuYnkgPSAnaWRlbnQnLCBjb2xzID0gKQpEaW1QbG90KGFsbF9kYXRhLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpCmRldi5vZmYoKQoKYGBgCgpgYGB7cn0KcGRmKCcyMDIyXzAxXzE0X2FuYWx5c2lzX3NjcmlwdHMvMjAyMl8wNV8yN19hbmFseXNpcy9MaW5lYWdlX2V4cHJlc3Npb24vdGVzdF92aW9saW4ucGRmJywgaGVpZ2h0ID0gMTAsIHdpZHRoID0gMzApCgpWbG5QbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9ICdOR0ZSJywgaWRlbnRzID0gJ01haW50YWluZWQgUmVzaXN0YW50IHRvIERhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKVmxuUGxvdChhbGxfZGF0YSwgZmVhdHVyZXMgPSAnRUdGUicsIGlkZW50cyA9ICdNYWludGFpbmVkIFJlc2lzdGFudCB0byBEYWJUcmFtJywgZ3JvdXAuYnkgPSAiTGluZWFnZSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArIGdlb21fYm94cGxvdChmaWxsID0gJ3doaXRlJywgd2lkdGggPSAwLjEpClZsblBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gJ05HRlInLCBpZGVudHMgPSAnTWFpbnRhaW5lZCBSZXNpc3RhbnQgdG8gRGFiVHJhbXRvRGFiVHJhbScsIGdyb3VwLmJ5ID0gIkxpbmVhZ2UiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKyBnZW9tX2JveHBsb3QoZmlsbCA9ICd3aGl0ZScsIHdpZHRoID0gMC4xKQpWbG5QbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9ICdFR0ZSJywgaWRlbnRzID0gJ01haW50YWluZWQgUmVzaXN0YW50IHRvIERhYlRyYW10b0RhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKClZsblBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gJ05HRlInLCBpZGVudHMgPSAnTGFyZ2UgUmVzaXN0YW50IHRvIERhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKVmxuUGxvdChhbGxfZGF0YSwgZmVhdHVyZXMgPSAnRUdGUicsIGlkZW50cyA9ICdMYXJnZSBSZXNpc3RhbnQgdG8gRGFiVHJhbScsIGdyb3VwLmJ5ID0gIkxpbmVhZ2UiKSArIHRoZW1lKGxlZ2VuZC5wb3NpdGlvbiA9ICdub25lJykgKyBnZW9tX2JveHBsb3QoZmlsbCA9ICd3aGl0ZScsIHdpZHRoID0gMC4xKQpWbG5QbG90KGFsbF9kYXRhLCBmZWF0dXJlcyA9ICdOR0ZSJywgaWRlbnRzID0gJ0xhcmdlIFJlc2lzdGFudCB0byBEYWJUcmFtdG9EYWJUcmFtJywgZ3JvdXAuYnkgPSAiTGluZWFnZSIpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uID0gJ25vbmUnKSArIGdlb21fYm94cGxvdChmaWxsID0gJ3doaXRlJywgd2lkdGggPSAwLjEpClZsblBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gJ0VHRlInLCBpZGVudHMgPSAnTGFyZ2UgUmVzaXN0YW50IHRvIERhYlRyYW10b0RhYlRyYW0nLCBncm91cC5ieSA9ICJMaW5lYWdlIikgKyB0aGVtZShsZWdlbmQucG9zaXRpb24gPSAnbm9uZScpICsgZ2VvbV9ib3hwbG90KGZpbGwgPSAnd2hpdGUnLCB3aWR0aCA9IDAuMSkKCmRldi5vZmYoKQojVmxuUGxvdChhbGxfZGF0YSwgZmVhdHVyZXMgPSAnTkdGUicsIGlkZW50cyA9IGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnZGFidHJhbScsIGdyb3VwLmJ5ID0gImxpbmVhZ2UiKQpgYGAKCiNMb29raW5nIGludG8gdGhlIG9uZSBsaW5lYWdlIHRoYXQgc3dpdGNoZXMgbmdmciAtPiBlZ2ZyCmBgYHtyfQoKc3dpdGNoX2xpbl9kYWJ0cmFtIDwtIG5hbWVzKGFsbF9kYXRhJG9yaWcuaWRlbnRbYWxsX2RhdGEkTGluZWFnZSA9PSAiTGluMTcxNTE2IiAmIGFsbF9kYXRhJE9HX2NvbmRpdGlvbiA9PSAnZGFidHJhbSddKQpzd2l0Y2hfbGluX2RhYnRyYW10b2RhYnRyYW0gPC0gbmFtZXMoYWxsX2RhdGEkb3JpZy5pZGVudFthbGxfZGF0YSRMaW5lYWdlID09ICJMaW4xNzE1MTYiICYgYWxsX2RhdGEkT0dfY29uZGl0aW9uID09ICdkYWJ0cmFtdG9kYWJ0cmFtJ10pCgpEaW1QbG90KGFsbF9kYXRhLCBncm91cC5ieSA9ICJPR19jb25kaXRpb24iLCBjb2xzID0gYygnZGFidHJhbScgPSAnIzYyMzU5NCcsICdjb2NsMicgPSAnIzBGODI0MScsICdjaXMnID0gJyNDOTZEMjknLCAnZGFidHJhbXRvZGFidHJhbScgPSAnIzU2MUU1OScsICdkYWJ0cmFtdG9jb2NsMicgPSAnI0EyMjQ4RScsICdkYWJ0cmFtdG9jaXMnID0gJyM5RDg1QkUnLCAnY29jbDJ0b2RhYnRyYW0nID0gJyMxMDQxM0InLCAnY29jbDJ0b2NvY2wyJyA9ICcjNkFCRDQ1JywgJ2NvY2wydG9jaXMnID0gJyM2REM0OUMnLCAnY2lzdG9kYWJ0cmFtJyA9ICcjQTIzNjIyJywgJ2Npc3RvY29jbDInID0gJyNGNDkxMjknLCAnY2lzdG9jaXMnID0gJyNGQkQwOEMnKSkKRGltUGxvdChhbGxfZGF0YSwgY2VsbHMuaGlnaGxpZ2h0ID0gbGlzdChzd2l0Y2hfbGluX2RhYnRyYW0pLCBjb2xzLmhpZ2hsaWdodCA9IGMoJ3JlZCcpKQpEaW1QbG90KGFsbF9kYXRhLCBjZWxscy5oaWdobGlnaHQgPSBsaXN0KHN3aXRjaF9saW5fZGFidHJhbSwgc3dpdGNoX2xpbl9kYWJ0cmFtdG9kYWJ0cmFtKSwgY29scy5oaWdobGlnaHQgPSBjKCdibHVlJywgJ3JlZCcpKQoKc3dpdGNoX2xpbiA8LSBuYW1lcyhkYWJ0cmFtJG9yaWcuaWRlbnRbZGFidHJhbSRMaW5lYWdlID09ICJMaW4xNzE1MTYiXSkKRGltUGxvdChkYWJ0cmFtKQpEaW1QbG90KGRhYnRyYW0sIGNlbGxzLmhpZ2hsaWdodCA9IGxpc3Qoc3dpdGNoX2xpbikpCgojbmVlZCB0byBpbnRlZ3JhdGUgbGluZWFnZXMgaW50byBqdXN0IGRhYnRyYW0gb2JqZWN0IGFuZCB0aGVuIHBsb3Qgb2ZmIG9mIHRoaXMgaXNudGVhZD8KI3ZsbnBsb3QoYWxsX2RhdGEsIGZlYXR1cmVzID0gbmdmciwgaWRlbnRzID0ganVzdCB0aGUgY2VsbHMgcmVzaXN0YW50IHRvIGRhYnRyYW0sIGdyb3VwLmJ5ID0gbGluZWFnZSBidXQgaSBvbmx5IHdhbnQgdGhvc2UgaW5jbHVkZWQgaW4gY29tYmluZWRfbGluc19saXN0JGRhYnRyYW0gPwoKYGBgCgojZnJvbSBkYWJ0cmFtX2JvdGhfdGltZXMsIGZvcmNlIDIgY2x1c3RlcnMgaW4gdW1hcCwgcGxvdCB2cyBuZ2ZyIGVnZnIsIGZpbmQgbWFya2VycyBvZiB0aGVzZSAyCmBgYHtyfQoKZGFidHJhbV9ib3RoX3RpbWVzX21hcmtlcnMgPC0gRmluZEFsbE1hcmtlcnMoZGFidHJhbV9ib3RoX3RpbWVzLCBvbmx5LnBvcyA9IFRSVUUsIG1pbi5wY3QgPSAwLjI1LCBsb2dmYy50aHJlc2hvbGQgPSAwLjI1KQpEaW1QbG90KGRhYnRyYW1fYm90aF90aW1lcykKRGltUGxvdChkYWJ0cmFtX2JvdGhfdGltZXMsIGdyb3VwLmJ5ID0gJ09HX2NvbmRpdGlvbicpCkZlYXR1cmVQbG90KGRhYnRyYW1fYm90aF90aW1lcywgZmVhdHVyZXMgPSBjKCdOR0ZSJywgJ0VHRlInLCAnbkZlYXR1cmVfUk5BJykpCmBgYAoKI0Fzc2lnbiBjbHVzdGVyIGFzc2lnbm1lbnRzIHBlciBsaW5lYWdlLCBmaW5kIGF2ZXJhZ2Ugc2NvcmUgcGVyIGxpbmVhZ2UgLSBtYWtlIHBsb3RzIGluIG9yZGVyCmBgYHtyfQojYXZlcmFnZSBjZWxsIGFzc2lnbm1lbnRzIHBlciBsaW5lYWdlIGluIGRhYnRyYW1fbWFpbnRhaW5lZAoKI3dhbnQgdG8gZG8gYSBzdGFja2VkIGJhcnBsb3QgaGVyZS0tIGNvcHkgcGFzdGUgY29kZSBmcm9tIGNvbmRpdGlvbiBjbHVzdGVyaW5nCgojZ2V0IGxpbmVhZ2UgYW5kIGNsdXN0ZXIgZGF0YSBmcm9tIHNldXJhdCBvYmplY3QsIHN3aXRjaCBjbHVzdGVyIGlkZW50aWZpZXJzIGZyb20gMCwxIHRvIC0xLDEgKGVnZnIsIG5nZnIpCmNsdXN0ZXJzX3Blcl9saW4gPC0gZGF0YS5mcmFtZSAoQ2x1c3RlciA9IGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGRhYnRyYW1fYm90aF90aW1lcyRzZXVyYXRfY2x1c3RlcnMpKSwgTGluZWFnZSA9IGRhYnRyYW1fYm90aF90aW1lcyRMaW5lYWdlLCBjb25kaXRpb24gPSBkYWJ0cmFtX2JvdGhfdGltZXMkT0dfY29uZGl0aW9uKQpjbHVzdGVyc19wZXJfbGluJENsdXN0ZXJbY2x1c3RlcnNfcGVyX2xpbiRDbHVzdGVyID09IDBdIDwtIC0xCmNsdXN0ZXJzX3Blcl9saW5fbGlzdCA8LSBsaXN0KCkKCiMgTmVlZCB0byBnZXQgcGVyY2VudCB2YWx1ZXMgb2YgRUdGUiBmb3IgdGhlIGxpbmVhZ2UgYWZ0ZXIgdGhlIGZpcnN0IHRyZWF0bWVudApmb3IgKGkgaW4gZml2ZWNlbGxfY0ROQSREYWJUcmFtKXsKICBjdXJyZW50bGluIDwtIGZpbHRlcihjbHVzdGVyc19wZXJfbGluLCBjbHVzdGVyc19wZXJfbGluJExpbmVhZ2UgPT0gaSAmIGNsdXN0ZXJzX3Blcl9saW4kY29uZGl0aW9uID09ICdkYWJ0cmFtJykKICBWYXIxIDwtIGMoLTEsMSkKICBGcmVxIDwtIGMoc3VtKGZpbHRlcihjbHVzdGVyc19wZXJfbGluLCBjbHVzdGVyc19wZXJfbGluJExpbmVhZ2UgPT0gaSAmIGNsdXN0ZXJzX3Blcl9saW4kY29uZGl0aW9uID09ICdkYWJ0cmFtJykkQ2x1c3RlciA9PSAtMSksICMgRUdGUgogIHN1bShmaWx0ZXIoY2x1c3RlcnNfcGVyX2xpbiwgY2x1c3RlcnNfcGVyX2xpbiRMaW5lYWdlID09IGkgJiBjbHVzdGVyc19wZXJfbGluJGNvbmRpdGlvbiA9PSAnZGFidHJhbScpJENsdXN0ZXIgPT0gMSkpCiAgY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0gPC0gZGF0YS5mcmFtZSgnVmFyMScgPSBWYXIxLCAnRnJlcScgPSBGcmVxKQogIGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJFNjb3JlIDwtIHdlaWdodGVkLm1lYW4oYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kVmFyMSkpLCBjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRGcmVxKQp9CgojIEJ1aWxkIGEgZGF0YWZyYW1lIGZvciBwbG90dGluZyBiYXNlZCBvbiAlIEVHRlIgb3IgTkdGUiBwZXIgbGluZWFnZSBhZnRlciBmaXJzdCB0cmVhdG1lbnQKY2x1c3RlcnNfcGVyX2xpbl9kZiA8LSBkYXRhLmZyYW1lKG1hdHJpeChuY29sID0gNSwgbnJvdyA9IDApKQpjb2xuYW1lcyhjbHVzdGVyc19wZXJfbGluX2RmKSA8LSBjKCdMaW5lYWdlJywgJ1BlcmNlbnRfY2VsbHMnLCAnTnVtX2NlbGxzJywgJ1Njb3JlJykKZm9yIChpIGluIG5hbWVzKGNsdXN0ZXJzX3Blcl9saW5fbGlzdCkpewogICAgY2x1c3RlcnNfcGVyX2xpbl9kZiA8LSByYmluZChjbHVzdGVyc19wZXJfbGluX2RmLCBkYXRhLmZyYW1lKCdMaW5lYWdlJyA9IGksICdQZXJjZW50X2NlbGxzJyA9IGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJEZyZXFbY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kVmFyMSA9PSAxXS9zdW0oY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kRnJlcSksICdOdW1fY2VsbHMnID0gc3VtKGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJEZyZXFbY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kVmFyMSA9PSAxXSksICdTY29yZScgPSBjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRTY29yZVsxXSwgJ0NsdXN0ZXInID0gJ05HRlInKSkgIyBBZGQgTkdGUiByb3cKICBjbHVzdGVyc19wZXJfbGluX2RmIDwtIHJiaW5kKGNsdXN0ZXJzX3Blcl9saW5fZGYsIGRhdGEuZnJhbWUoJ0xpbmVhZ2UnID0gaSwgJ1BlcmNlbnRfY2VsbHMnID0gY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kRnJlcVtjbHVzdGVyc19wZXJfbGluX2xpc3RbW2ldXSRWYXIxID09IC0xXS9zdW0oY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kRnJlcSksICdOdW1fY2VsbHMnID0gc3VtKGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJEZyZXFbY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kVmFyMSA9PSAtMV0pLCAnU2NvcmUnID0gY2x1c3RlcnNfcGVyX2xpbl9saXN0W1tpXV0kU2NvcmVbMV0sICdDbHVzdGVyJyA9ICdFR0ZSJykpICMgQWRkIEVHRlIgcm93Cn0KCiMgUmVvcmRlciBzbyB0aGF0IEVHRlIgZG9taW5hbnQgbGluZWFnZXMgYXJlIHBsb3QgZmlyc3QKY2x1c3RlcnNfcGVyX2xpbl9kZiA8LSBjbHVzdGVyc19wZXJfbGluX2RmW3dpdGgoY2x1c3RlcnNfcGVyX2xpbl9kZiwgb3JkZXIoLVNjb3JlLE51bV9jZWxscyApKSxdCmNsdXN0ZXJzX3Blcl9saW5fZGYkTGluZWFnZSA8LSBmYWN0b3IoY2x1c3RlcnNfcGVyX2xpbl9kZiRMaW5lYWdlLCBsZXZlbHMgPSByZXYodW5pcXVlKGNsdXN0ZXJzX3Blcl9saW5fZGYkTGluZWFnZSkpKQoKIyBtYWtlIGxpc3Qgb2JqZWN0IGZvciBhZnRlciBzZWNvbmQgdHJlYXRtZW50CmNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWMgPC0gbGlzdCgpCgojIE5lZWQgdG8gZ2V0IHBlcmNlbnQgdmFsdWVzIG9mIEVHRlIgZm9yIHRoZSBsaW5lYWdlIGFmdGVyIHRoZSBzZWNvbmQgdHJlYXRtZW50CmZvciAoaSBpbiBmaXZlY2VsbF9jRE5BJERhYlRyYW0pewogIGN1cnJlbnRsaW4gPC0gZmlsdGVyKGNsdXN0ZXJzX3Blcl9saW4sIGNsdXN0ZXJzX3Blcl9saW4kTGluZWFnZSA9PSBpICYgY2x1c3RlcnNfcGVyX2xpbiRjb25kaXRpb24gPT0gJ2RhYnRyYW10b2RhYnRyYW0nKQogIFZhcjEgPC0gYygtMSwxKQogIEZyZXEgPC0gYyhzdW0oZmlsdGVyKGNsdXN0ZXJzX3Blcl9saW4sIGNsdXN0ZXJzX3Blcl9saW4kTGluZWFnZSA9PSBpICYgY2x1c3RlcnNfcGVyX2xpbiRjb25kaXRpb24gPT0gJ2RhYnRyYW10b2RhYnRyYW0nKSRDbHVzdGVyID09IC0xKSwgIyBFR0ZSCiAgc3VtKGZpbHRlcihjbHVzdGVyc19wZXJfbGluLCBjbHVzdGVyc19wZXJfbGluJExpbmVhZ2UgPT0gaSAmIGNsdXN0ZXJzX3Blcl9saW4kY29uZGl0aW9uID09ICdkYWJ0cmFtdG9kYWJ0cmFtJykkQ2x1c3RlciA9PSAxKSkKICBjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0gPC0gZGF0YS5mcmFtZSgnVmFyMScgPSBWYXIxLCAnRnJlcScgPSBGcmVxKQogIGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRTY29yZSA8LSB3ZWlnaHRlZC5tZWFuKGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRWYXIxKSksIGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRGcmVxKQp9CgojIEJ1aWxkIGEgZGF0YWZyYW1lIGZvciBwbG90dGluZyBiYXNlZCBvbiAlIEVHRlIgb3IgTkdGUiBwZXIgbGluZWFnZSBhZnRlciBzZWNvbmQgdHJlYXRtZW50CmNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjIDwtIGRhdGEuZnJhbWUobWF0cml4KG5jb2wgPSA1LCBucm93ID0gMCkpCmNvbG5hbWVzKGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjKSA8LSBjKCdMaW5lYWdlJywgJ1BlcmNlbnRfY2VsbHMnLCAnTnVtX2NlbGxzJywgJ1Njb3JlJywgJ0NsdXN0ZXInKQpmb3IgKGkgaW4gbmFtZXMoY2x1c3RlcnNfcGVyX2xpbl9saXN0KSl7CgogIGlmIChzdW0oY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJEZyZXEpIDwgNSl7CiAgICBjbHVzdGVyc19wZXJfbGluX2RmX3NlYyA8LSByYmluZChjbHVzdGVyc19wZXJfbGluX2RmX3NlYywgZGF0YS5mcmFtZSgnTGluZWFnZScgPSBpLCAnUGVyY2VudF9jZWxscycgPSAxLCAnTnVtX2NlbGxzJyA9IDAsICdTY29yZScgPSAwLCAnQ2x1c3RlcicgPSAnRGllZCcpKSAjIEFkZCBMaW5lYWdlIGRpZWQgcm93CiAgICBjbHVzdGVyc19wZXJfbGluX2RmX3NlYyA8LSByYmluZChjbHVzdGVyc19wZXJfbGluX2RmX3NlYywgZGF0YS5mcmFtZSgnTGluZWFnZScgPSBpLCAnUGVyY2VudF9jZWxscycgPSAwLCAnTnVtX2NlbGxzJyA9IDAsICdTY29yZScgPSAwLCAnQ2x1c3RlcicgPSAnTkdGUicpKSAjIEFkZCBOR0ZSIHJvdwogICAgY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMgPC0gcmJpbmQoY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMsIGRhdGEuZnJhbWUoJ0xpbmVhZ2UnID0gaSwgJ1BlcmNlbnRfY2VsbHMnID0gMCwgJ051bV9jZWxscycgPSAwLCAnU2NvcmUnID0gMCwgJ0NsdXN0ZXInID0gJ0VHRlInKSkgIyBBZGQgRUdGUiByb3cKICB9ZWxzZXsgIyBBY3R1YWxseSBjYWxjdWxhdGUgcGVyY2VudGFnZXMgc2luY2UgdGhlIGxpbmVhZ2Ugc3Vydml2ZWQvaXMgbW9yZSB0aGFuIDUgY2VsbHMKICAgICAgY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMgPC0gcmJpbmQoY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMsIGRhdGEuZnJhbWUoJ0xpbmVhZ2UnID0gaSwgJ1BlcmNlbnRfY2VsbHMnID0gMCwgJ051bV9jZWxscycgPSAwLCAnU2NvcmUnID0gY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJFNjb3JlWzFdLCAnQ2x1c3RlcicgPSAnRGllZCcpKSAjIEFkZCBMaW5lYWdlIGRpZWQgcm93CiAgICAgIGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjIDwtIHJiaW5kKGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjLCBkYXRhLmZyYW1lKCdMaW5lYWdlJyA9IGksICdQZXJjZW50X2NlbGxzJyA9IGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRGcmVxW2NsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRWYXIxID09IDFdL3N1bShjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kRnJlcSksICdOdW1fY2VsbHMnID0gc3VtKGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRGcmVxW2NsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRWYXIxID09IDFdKSwgJ1Njb3JlJyA9IGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRTY29yZVsxXSwgJ0NsdXN0ZXInID0gJ05HRlInKSkgIyBBZGQgTkdGUiByb3cKICAgICAgY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMgPC0gcmJpbmQoY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMsIGRhdGEuZnJhbWUoJ0xpbmVhZ2UnID0gaSwgJ1BlcmNlbnRfY2VsbHMnID0gY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJEZyZXFbY2x1c3RlcnNfcGVyX2xpbl9saXN0X3NlY1tbaV1dJFZhcjEgPT0gLTFdL3N1bShjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kRnJlcSksICdOdW1fY2VsbHMnID0gc3VtKGNsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRGcmVxW2NsdXN0ZXJzX3Blcl9saW5fbGlzdF9zZWNbW2ldXSRWYXIxID09IC0xXSksICdTY29yZScgPSBjbHVzdGVyc19wZXJfbGluX2xpc3Rfc2VjW1tpXV0kU2NvcmVbMV0sICdDbHVzdGVyJyA9ICdFR0ZSJykpICMgQWRkIEVHRlIgcm93CiAgICB9Cn0KCiMgUmVvcmRlciBzbyB0aGF0IEVHRlIgZG9taW5hbnQgbGluZWFnZXMgYXJlIHBsb3QgZmlyc3QKY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMkTGluZWFnZSA8LSBmYWN0b3IoY2x1c3RlcnNfcGVyX2xpbl9kZl9zZWMkTGluZWFnZSwgbGV2ZWxzID0gcmV2KHVuaXF1ZShjbHVzdGVyc19wZXJfbGluX2RmJExpbmVhZ2UpKSkKCiMgUGxvdApwMSA8LSBnZ3Bsb3QoY2x1c3RlcnNfcGVyX2xpbl9kZiwgYWVzKHkgPSBQZXJjZW50X2NlbGxzLCB4ID0gTGluZWFnZSwgZmlsbCA9IENsdXN0ZXIpKSArIGdlb21fYmFyKHN0YXQgPSAnaWRlbnRpdHknLCBwb3NpdGlvbiA9IHBvc2l0aW9uX2ZpbGwocmV2ZXJzZSA9IFQpLCBjb2xvciA9ICcjRDNEM0QzJykgKyBzY2FsZV9maWxsX21hbnVhbCh2YWx1ZXMgPSBjKCIjMDAwMDAwIiwiI0ZGRkZGRiIpKSArIHRoZW1lX2NsYXNzaWMoKSArIHRoZW1lKGF4aXMudGV4dC54ID0gZWxlbWVudF90ZXh0KGFuZ2xlID0gOTAsIHZqdXN0ID0gMC41LCBoanVzdD0xKSkKcDIgPC0gZ2dwbG90KGNsdXN0ZXJzX3Blcl9saW5fZGZfc2VjLCBhZXMoeSA9IFBlcmNlbnRfY2VsbHMsIHggPSBMaW5lYWdlLCBmaWxsID0gQ2x1c3RlcikpICsgZ2VvbV9iYXIoc3RhdCA9ICdpZGVudGl0eScsIHBvc2l0aW9uID0gcG9zaXRpb25fZmlsbChyZXZlcnNlID0gVCksIGNvbG9yID0gJyNEM0QzRDMnKSArIHNjYWxlX2ZpbGxfbWFudWFsKHZhbHVlcyA9IGMoIiNGRjAwMDAiLCIjMDAwMDAwIiwgJyNGRkZGRkYnKSkgKyB0aGVtZV9jbGFzc2ljKCkgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfdGV4dChhbmdsZSA9IDkwLCB2anVzdCA9IDAuNSwgaGp1c3Q9MSkpCgpwZGYoJzIwMjJfMDFfMTRfYW5hbHlzaXNfc2NyaXB0cy8yMDIyXzA1XzI3X2FuYWx5c2lzL0xpbmVhZ2VfZXhwcmVzc2lvbi9zdGFja2VkX2Jhcl9FR0ZSX05HRlJfRGllZC5wZGYnKQpnZ2FycmFuZ2UocDEscDIsIG5yb3cgPSAyKQpkZXYub2ZmKCkKYGBgCgojUGxvdCBzY29yZXMgYXMgaGVhdG1hcApgYGB7cn0Kc2NvcmVfbWF0cml4IDwtIG1hdHJpeChuY29sID0gMiwgbnJvdyA9IGxlbmd0aChmaXZlY2VsbF9jRE5BJERhYlRyYW1NYWludGFpbmVkKSkKY29sbmFtZXMoc2NvcmVfbWF0cml4KSA8LSBjKCd0aW1lIDEnLCAndGltZSAyJykKcm93bmFtZXMoc2NvcmVfbWF0cml4KSA8LSB1bmxpc3QoZml2ZWNlbGxfY0ROQSREYWJUcmFtTWFpbnRhaW5lZCkKCmZvciAoaSBpbiByb3duYW1lcyhzY29yZV9tYXRyaXgpKXsKICBzY29yZV9tYXRyaXhbaSwgJ3RpbWUgMSddIDwtIGNsdXN0ZXJzX3Blcl9saW5fbGlzdFtbaV1dJFNjb3JlWzFdCiAgc2NvcmVfbWF0cml4W2ksICd0aW1lIDInXSA8LSBjbHVzdGVyc19wZXJfbGluX2xpc3RbW3Bhc3RlKGksICdzZWNvbmQnKV1dJFNjb3JlWzFdCn0KCnNjb3JlX21hdHJpeCA8LSBzY29yZV9tYXRyaXhbb3JkZXIoc2NvcmVfbWF0cml4WywxXSwgZGVjcmVhc2luZyA9IFRSVUUpLF0KCnBkZignMjAyMl8wMV8xNF9hbmFseXNpc19zY3JpcHRzLzIwMjJfMDVfMjdfYW5hbHlzaXMvTGluZWFnZV9leHByZXNzaW9uL2hlYXRtYXBfdGVzdC5wZGYnLCB3aWR0aCA9IDEwLCBoZWlnaHQgPSAxMikKaGVhdG1hcChzY29yZV9tYXRyaXgsIHNjYWxlID0gIm5vbmUiLCBDb2x2ID0gTkEsIFJvd3YgPSBOQSwgY29sID0gYnJld2VyLnBhbChuID0gOSwgbmFtZSA9ICdHcmV5cycpKQpkZXYub2ZmKCkKCmBgYAo=